#include "sys.h"

#define START_WIN_NUM_VP        0x2000 //启动界面上的数据变量显示控件的VP地址 
#define CAN_BAUDERATE           1000000

//因为数据变量显示控件的变量类型设置为了"长整数(4字节)",
//所以num变量的数据类型得设为u32,即也是4字节,保持一致
__xdata u32 num;
__xdata u16 index;

char _sdcc_external_startup(void)
{
    return 0;
}

/*
 * sdcc 规定中断函数必须要在 main 函数定义的文件中
 * */
void sys_timer0_isr() __interrupt (1);
void sys_timer2_isr() __interrupt (5);
void can_isr() __interrupt (9);

static void gpio_init(void)
{
    P2MDOUT |= 0x01;
    P0MDOUT |= 0x01;
    P2 = 0x1;
    P0 &= ~0x0;
}

__xdata u8 gs_value[2];
__xdata u16 gs_event;
void main(void)
{
	sys_init();//系统初始化
	gpio_init();
	can_init(CAN_BAUDERATE);
	//num变量赋予初值0,注意,对于xdata存储区域的变量,在定义的时候,不能
	//直接赋初值,即对于xdata u32 num = 0;这种定义变量的方式是有问题的,
	//这是由于T5L芯片内部自身原因造成的,因为T5L芯片内部扩展的32KB ram
	//必须得在sys_init()系统初始化之后才能够被正常的访问,
	//如果你想在定义变量的时候进行赋初值,那么你可以使用data或者idata关键字,
	//如 idata u32 num = 0;所示
	while(1)
	{
#if 0
		//sys_write_vp(START_WIN_NUM_VP,(u8*)&num,2);//把当前的数值更新到VP地址,4字节也就是2个字
		sys_write_vp_u32(START_WIN_NUM_VP,num++);//把当前的数值更新到VP地址,4字节也就是2个字
		//sys_delay_about_ms(1000);//精确延时1秒
		sys_write_vp_u16(0x2500, (index% 3) + 2);//把当前的数值更新到VP地址,4字节也就是2个字
		//sys_delay_about_ms(1000);//精确延时1秒
		sys_write_vp_u16(0x3200, index);//把当前的数值更新到VP地址,4字节也就是2个字
		//sys_delay_about_ms(1000);//精确延时1秒
		sys_write_vp_u16(0x3500, (index% 3) + 2);//把当前的数值更新到VP地址,4字节也就是2个字
		//sys_delay_about_ms(1000);//精确延时1秒
		sys_write_vp_u16(0x3000, (index++ % 3) + 2);//把当前的数值更新到VP地址,4字节也就是2个字
		sys_delay_about_ms(1000);//精确延时1秒
		sys_delay_ms(1000);
#else
		gs_event = get_event_status();
		switch (gs_event)
		{
			/* TODO with the event */
			case TOUCH_EVENT_SMART_MDOE:
			case TOUCH_EVENT_MANUAL_MDOE:
			case TOUCH_EVENT_PLAY_MDOE:
			case TOUCH_EVENT_STAND_MDOE:
			case TOUCH_EVENT_SLEEP_MDOE:
			case TOUCH_EVENT_WEAKUP_MDOE:
				control_lamp_with_mode(gs_event);
				clear_event_status();
				break;
			case TOUCH_EVENT_WHOLE_CONTROL:
				/* TODO get whole level */
                sys_read_vp(TOUCH_WHOLE_CONTROL_VALUE_ADDR, gs_value, 1);
				control_whole_lamp_with_level(gs_value[0] << 8 | gs_value[1]);
				clear_event_status();
				break;
			case TOUCH_EVENT_LED01_CONTROL:
                sys_read_vp(TOUCH_LED01_CONTROL_VALUE_ADDR, gs_value, 1);
				control_one_lamp_with_level(0x01, gs_value[0] << 8 | gs_value[1]);
				clear_event_status();
				break;
			case TOUCH_EVENT_LED02_CONTROL:
                sys_read_vp(TOUCH_LED02_CONTROL_VALUE_ADDR, gs_value, 1);
				control_one_lamp_with_level(0x02, gs_value[0] << 8 | gs_value[1]);
				clear_event_status();
				break;
			case TOUCH_EVENT_LED03_CONTROL:
                sys_read_vp(TOUCH_LED03_CONTROL_VALUE_ADDR, gs_value, 1);
				control_one_lamp_with_level(0x03, gs_value[0] << 8 | gs_value[1]);
				clear_event_status();
				break;
			default:
				break;
		}
		sys_delay_ms(10);
#endif
	}
}

